document.addEventListener('click', function(e) {
	e = e || e.event;
	var target = e.target || e.srcElement;
	var text = target.textContent || target.innerText;
	var tagName = target['tagName'];
	utils.log('Нажатие по элементу с тэгом: ' + tagName + ' и тестом: ' + text);
	
	let outMsg = new Object();
	outMsg.tagName = tagName
	outMsg.text = text
	outMsg.timestamp = utils.getTimestamp()

	let message = new Object();
	message.data = JSON.stringify(outMsg)
	message.sender = utils.current
	message.recipient = 'content_script'
	utils.logOutMessage(message)
	window.postMessage( JSON.stringify(message) );
}, false);

window.addEventListener("message", async function (event) {
	let inMsg = JSON.parse(event.data)
	if (inMsg['recipient'] === utils.current) {
		utils.logInMessage(inMsg)
		let data = inMsg['data']
		if (data !== '') {
			alert(data)
		}
	} else {
		utils.logIgnoreMessage(inMsg)
	}
}, false);

// В inject_script.js невозможно импортировать сторонние библиотеки,
// как обходной путь - объявить класс в нужном скрипте.
// v 0.0.1
class MessageSenderUtils {
	constructor(current) {
		this.current = current;
	}

	getObject(name, value) {
		this.log(`=== Объект ${name}, тип данных: ${typeof value}]`)
		if (typeof value === 'string') {
			this.log(' - тип данных: string, значение: ' + value)
		} else {
			for (var key in value) {
				this.log(' > тип данных: ' + typeof value[key] + ', ключ: ' + key + ', значение: ' + value[key])
			}
		}
		try {
			this.log(' - JSON.parse: ' + JSON.parse(value))
		} catch(e) {}
		try {
			this.log(' - JSON.stringify: ' + JSON.stringify(value))
		} catch(e) {}
		this.log('===')
	}

	log(text) {
		console.log(`${this.getTimestamp()} [${this.current}] ${text}`)
	}

	table(object) {
		console.table(object)
	}

	getTimestamp() {
		var now = new Date();
		var date = new Date(now.getTime() - now.getTimezoneOffset() * 60000)
		return this.formatDateTime(date.toISOString());
	}

	formatDateTime(value) {
		return value.replace('T', ' ').replace('Z', '')
	}

	logMessage(from, to, message) {
		this.log(`${from} -> ${to}: ${message}`)
	}

	getEntry(type, typeSender, message) {
		let entry = new Object();
		entry.type = type
		entry.typeSender = typeSender
		entry.sender = this.current
		entry.message = message
		entry.time = this.getTimestamp()

		return entry
	}

	logOutMessage(message) {
		let result = `Исходящее сообщение:\n`
		result += `Отправитель: ${message.sender}\n`
		result += `Получатель: ${message.recipient}\n`
		result += `Данные: ${message.data}`

		this.log(result)
		
		if (message.sender === undefined) {
			console.warn(`Отcутствует значение: message.sender`)
		}
		if (message.recipient === undefined) {
			console.warn(`Отcутствует значение: message.recipient`)
		}
		if (message.data === undefined) {
			console.warn(`Отcутствует значение: message.data`)
		}
	}

	logInMessage(message) {
		let result = `Входящее сообщение:\n`

		result += `Отправитель: ${message.sender}\n`
		result += `Получатель: ${message.recipient}\n`
		result += `Данные: ${message.data}`

		this.log(result)

		if (message.sender === undefined) {
			console.warn(`Отcутствует значение: message.sender`)
		}
		if (message.recipient === undefined) {
			console.warn(`Отcутствует значение: message.recipient`)
		}
		if (message.data === undefined) {
			console.warn(`Отcутствует значение: message.data`)
		}
	}

	logIgnoreMessage(message) {
		this.log(`Сообщение проигнорировано, адресат: '${message['recipient']}'`)
	}
}
let utils = new MessageSenderUtils('inject_script')